﻿<%@ WebHandler Language="C#" Class="get_validate_code" %>

using System;
using System.Web;
using System.Threading;
using System.Drawing;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.IO;
public class get_validate_code : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        string o = CreateCode(4);

        context.Session.Add("valicode", o);

        context.Response.ContentType = "image/Jpeg";

        context.Response.BinaryWrite(CreateValidateGraphic(o));

        context.Response.ContentType = "text/plain";

        context.Response.Write(CreateCode(6));
    }
    /// <summary>
    /// 创建验证码图片
    /// </summary>
    /// <param name="validateCode"></param>
    /// <returns></returns>
    public byte[] CreateValidateGraphic(string validateCode)
    {
        Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 20);
        Graphics g = Graphics.FromImage(image);
        try
        {
            //生成随机生成器
            Random random = new Random();
            //清空图片背景色
            g.Clear(Color.White);
            //画图片的干扰线
            for (int i = 0; i < 25; i++)
            {
                int x1 = random.Next(image.Width);
                int x2 = random.Next(image.Width);
                int y1 = random.Next(image.Height);
                int y2 = random.Next(image.Height);
                g.DrawLine(new Pen(Color.Silver), x1, x2, y1, y2);
            }
            Font font = new Font("微软雅黑", 12, (FontStyle.Regular));
            LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
            g.DrawString(validateCode, font, brush, 3, 2);

            //画图片的前景干扰线
            for (int i = 0; i < 100; i++)
            {
                int x = random.Next(image.Width);
                int y = random.Next(image.Height);
                image.SetPixel(x, y, Color.FromArgb(random.Next()));
            }
            //画图片的边框线
            g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

            //保存图片数据
            MemoryStream stream = new MemoryStream();
            image.Save(stream, ImageFormat.Jpeg);

            //输出图片流
            return stream.ToArray();
        }
        finally
        {
            g.Dispose();
            image.Dispose();
        }
    }
    /// <summary>
    /// 生成随机字符
    /// </summary>
    /// <param name="length"></param>
    /// <returns></returns>
    private string CreateCode(int length)
    {
        string[] aa = "0,1,2,3,4,5,6,7,8,9".Split(',');

        string outter = string.Empty;

        for (int i = 0; i < length; i++)
        {
            Random r = new Random((int)DateTime.Now.Ticks);

            Thread.Sleep(1);

            outter += aa[r.Next(aa.Length)];
        }

        return outter;
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}